//////////////////////////////////////////////////////////////////////////////
// ¡¡ATENCIÓN!!
// Parte de este fichero ha sido autogenerado por Rosette. Utiliza las 
// regiones dispuestas por en el fichero para escribir el código necesario
// Todo lo que esté fuera de esas regiones será borrado en nuevas generaciones.
// ¡¡ATENCIÓN!!
//////////////////////////////////////////////////////////////////////////////
/**
@file ShootComponent.cpp

Fichero generado por Rosette para la implementación del componente ShootComponent

@author Rosette
*/

#include "ShootComponent.h"

#include "Logic/Entity/Entity.h"
#include "Logic/Maps/Map.h"
#include "Map/MapEntity.h"

// En esta región es donde se deben realizar las inclusiones de ficheros.
#pragma region UserImpInclusions

#include "Logic/Maps/EntityFactory.h"

#pragma endregion UserImpInclusions

namespace Logic 
{
	IMP_FACTORY(ShootComponent);
	
	//---------------------------------------------------------
	
// Los métodos de esta región no se deben modificar ya que serán reescritos
// en futuras generaciones de código
#pragma region UneditableMethods

	bool ShootComponent::spawn(CEntity *entity, CMap *map, const Map::CEntity *entityInfo) 
	{
		if(!Component::spawn(entity,map,entityInfo))
			return false;
		if(entityInfo->hasAttribute("shootDirection"))
			_shootDirection = entityInfo->getVector3Attribute("shootDirection");

		if(entityInfo->hasAttribute("shotType"))
			_shotType = entityInfo->getStringAttribute("shotType");

		if(entityInfo->hasAttribute("shotSecsAlive"))
			_shotSecsAlive = entityInfo->getFloatAttribute("shotSecsAlive");

		if(entityInfo->hasAttribute("shootEnabled"))
			_shootEnabled = entityInfo->getBoolAttribute("shootEnabled");

		return onSpawn();

	} // spawn
	
	//---------------------------------------------------------

	bool ShootComponent::accept(const TMessage &message)
	{
		return message._type == Message::ENABLE_SHOOT ||
			message._type == Message::SHOOT;
	} // accept

	//---------------------------------------------------------

	void ShootComponent::process(const TMessage &message)
	{
		Component::process(message);
		switch(message._type)
		{
		case Message::ENABLE_SHOOT: ENABLE_SHOOT(message._shootEnabled); break;
		case Message::SHOOT: SHOOT(); break;
		}
	} // process

	//---------------------------------------------------------

#pragma endregion UneditableMethods

// Los métodos de esta región se corresponden al ciclo de vida y a las 
// acciones y eventos del componente. Se deben rellenar sus cuerpos pero no
// cambiar la declaración. Eso se debe hacer en Rosette.
#pragma region AutogeneratedMethods

#pragma region 5
	ShootComponent::~ShootComponent()
	{
		
	} // ~ShootComponent
#pragma endregion 5
	
	//---------------------------------------------------------

#pragma region 1
	bool ShootComponent::onSpawn()
	{
		// get instance of shot, prefetching it so we don't have to search for it every time
		_shotPrefab = _entity->getMap()->getEntityByName(_shotType);

		return true;

	} // onSpawn
#pragma endregion 1
	
	//---------------------------------------------------------

#pragma region 2
	bool ShootComponent::activate()
	{
		return true;

	} // activate
#pragma endregion 2
	
	//---------------------------------------------------------

#pragma region 3
	void ShootComponent::deactivate()
	{
		
	} // deactivate
#pragma endregion 3
	
	//---------------------------------------------------------

#pragma region 4
	void ShootComponent::tick(unsigned int msecs)
	{
		Component::tick(msecs);

	} // tick
#pragma endregion 4
	
	//---------------------------------------------------------

#pragma region 1071
	void ShootComponent::ENABLE_SHOOT(bool shootEnabled)
	{
		_shootEnabled = shootEnabled;
	}
#pragma endregion 1071

	//---------------------------------------------------------

#pragma region 1058
	void ShootComponent::SHOOT()
	{
		if(!_shootEnabled) {
			return;
		}

		if(_shotPrefab) {
			// create a new shot
			CEntity *shot = CEntityFactory::getSingletonPtr()->instantiate(_shotPrefab,
				_entity->getPosition() + Vector3(_shootDirection.x * 75.0f, 0.0, 0.0));
			
			// delete shot after _timeAlive
			CEntityFactory::getSingletonPtr()->deferredDeleteEntity(shot, (unsigned int) _shotSecsAlive * 1000);

			// now send shot a message to start moving
			TMessage m;
			m._type = TMessageType::START_MOVING;
			m._direction = _shootDirection;

			shot->emitMessage(m);
		}
	}
#pragma endregion 1058

	//---------------------------------------------------------

#pragma endregion AutogeneratedMethods

// En esta región se implementan los métodos sin interés semántico que no 
// fueron declarados en Rosette. El contenido de esta región se mantendrá 
// entre generaciones.
#pragma region UserImpSpace

#pragma endregion UserImpSpace
} // namespace Logic

